﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Dziennik_ProfilNauczyciela {

    public partial class Form_WidokNauczyciela : Form {
        
       
        void WypelnijListeKlas() {
            string zapytanie =
                   @"select
                        k.id,
                        concat(floor(((k.semestr + 1) / 2)), k.nazwa) as klasa,
                        max(case
                            when k.userIdWychowawcy  = dziennik.dbo.getUserNameInt() then 2
                            when p.userIdNauczyciela = dziennik.dbo.getUserNameInt() then 1
                            else 0
                        end) as poziom,
                        k.semestr
                    from
                        dziennik.dbo.klasy k inner join
                        dziennik.dbo.przedmioty p on p.idKlasy = k.id
                    group by k.semestr, k.nazwa, k.id";
            SqlCommand c = new SqlCommand(zapytanie, SQLInterface.conn);
            SqlDataReader r = c.ExecuteReader();
            while (r.Read()) {
                listView_ListaKlas.Items.Add(r.GetInt32(0).ToString(), r.GetString(1), r.GetInt32(2) + 3);
                listView_ListaKlas.Items[listView_ListaKlas.Items.Count - 1].Tag = r.GetInt32(3);
            }
            r.Close();
        }
        void WypelnijListeUczniow() {
            listView_Uczniowie.Items.Clear();
            int idKlasy = Convert.ToInt32(listView_ListaKlas.SelectedItems[0].Name);
            var uczniowie = (from u in SQLInterface.linqDataContext.uczniowies
                             where u.idKlasy == idKlasy
                             select new { u.nazwisko, u.imie, u.userId })
                            .OrderBy(u => u.nazwisko);
            int i=1;
            foreach (var u in uczniowie) {
                listView_Uczniowie.Items.Add(new ListViewItem(new string[]{
                    (i >= 10 ? "" : " ") + i+".", 
                    u.nazwisko + " " + u.imie,
                    u.userId.ToString()
                }));
                i++;
            }
        }
        void WypelnijListePrzedmiotow() {
            int idKlasy = Convert.ToInt32(listView_ListaKlas.SelectedItems[0].Name);
            int semestr = (int)listView_ListaKlas.SelectedItems[0].Tag;
            var przedmioty = (from p in SQLInterface.linqDataContext.przedmioties
                              where p.idKlasy == idKlasy && p.semestr == semestr
                              select new { p.id, p.nazwa, czyUczysz = (p.userIdNauczyciela == SQLInterface.userId)})
                              .OrderBy(p => p.nazwa);
            foreach (var p in przedmioty) {
                int imgIndex = 3;
                if (p.czyUczysz)
                    imgIndex++;
                listView_Przedmioty.Items.Add(p.id.ToString(), p.nazwa, imgIndex);
            }
        }
        void WypelnijTabeleOcenUcznia() {
            if (listView_Przedmioty.SelectedItems.Count == 1 && listView_Uczniowie.SelectedItems.Count == 1) {

                int userIdUcznia = Convert.ToInt32(listView_Uczniowie.SelectedItems[0].SubItems[2].Text);
                int idPrzedmiotu = Convert.ToInt32(listView_Przedmioty.SelectedItems[0].Name);

                var oceny = (from o in SQLInterface.linqDataContext.ocenies
                            join u in SQLInterface.linqDataContext.uczniowies on o.userIdUcznia equals u.userId
                            join k in SQLInterface.linqDataContext.klasies on u.idKlasy equals k.id
                            join p in SQLInterface.linqDataContext.przedmioties on o.idPrzedmiotu equals p.id
                            where u.userId == userIdUcznia
                            && p.semestr == k.semestr
                            && p.id == idPrzedmiotu
                            select new {o.data, o.ocena, o.waga, o.zaCo}).OrderByDescending(o=>o.data);
                listView_Oceny.Items.Clear();
                foreach (var ocena in oceny) {
                    string ocenaString;
                    int pelnaOcena = (int)ocena.ocena;
                    double ocenaPoPrzecinku = ocena.ocena - (int)ocena.ocena;
                    if (ocenaPoPrzecinku >= 0.0 && ocenaPoPrzecinku <= 0.1) {
                        ocenaString = pelnaOcena.ToString();
                    }
                    else if (ocenaPoPrzecinku >0.1 && ocenaPoPrzecinku<=0.5) {
                        ocenaString = pelnaOcena.ToString() + "+";
                    }
                    else if (ocenaPoPrzecinku > 0.5 && ocenaPoPrzecinku <= 0.9) {
                        ocenaString = (pelnaOcena + 1).ToString() + "-";
                    }
                    else {
                        ocenaString = (pelnaOcena + 1).ToString();
                    }
                    
                    listView_Oceny.Items.Add(new ListViewItem(new string[]{
                        ocena.data.ToShortDateString(),
                        ocenaString,
                        ocena.waga.ToString(),
                        ocena.zaCo
                    }));
                }
                WypiszOcenyKoncowe();
            }
            else {
                WyczyscTabeleOcenUcznia();
                UstawPrzyciskiOcen();
            }
        }
        void WyczyscTabeleOcenUcznia() {
            listView_Oceny.Items.Clear();
            label_proponowanaOcenaKoncowa.Text = "-";
            label_OcenaKoncowa.Text = "-";
            label_proponowanePrzedmiotoweZachowanie.Text = "-";
            label_przedmiotoweZachowanie.Text ="-";
            label_proponowanieZachowanie.Text = "-";
            label_zachowanie.Text = "-";
        }

        void OdswiezKarte(int idZmiany) {
            // idZmiany: 1 - lista klas, 2 - lista przedmiotow, 3 - lista uczniow
            if (idZmiany == 1) { //zmieniono wybór listy klas
                if (listView_ListaKlas.SelectedItems.Count == 1) {
                    WypelnijListeUczniow();
                    WypelnijListePrzedmiotow();
                    pictureBox_DuzaIkonaKlasy.Image = imageList2.Images[listView_ListaKlas.SelectedItems[0].ImageIndex - 3];
                    label_Klasa.Text = "Klasa " + listView_ListaKlas.SelectedItems[0].Text;


                }
                else {
                    listView_Przedmioty.Items.Clear();
                    listView_Uczniowie.Items.Clear();
                    pictureBox_DuzaIkonaKlasy.Image = null;
                    pictureBox_DuzaIkonaPrzedmiotu.Image = null;
                    label_Klasa.Text = "";
                    label_Przedmiot.Text = "";
                }
                WyczyscTabeleOcenUcznia();
                pictureBox_DuzaIkonaPrzedmiotu.Image = null;
                pictureBox_DuzaIkonaUcznia.Image = null;
                label_Przedmiot.Text = "";
                label_Uczen.Text = "";
            }


            else if (idZmiany == 2) {//lista przedmiotów
                
                if (listView_Przedmioty.SelectedItems.Count == 1) {
                    pictureBox_DuzaIkonaPrzedmiotu.Image = imageList2.Images[(int)listView_Przedmioty.SelectedItems[0].ImageIndex - 3];
                    label_Przedmiot.Text = listView_Przedmioty.SelectedItems[0].Text;
                    WypelnijTabeleOcenUcznia();
                    
                    bool nauczyciel = listView_Przedmioty.SelectedItems[0].ImageIndex == 4;
                    bool wychowawca = listView_ListaKlas.SelectedItems[0].ImageIndex == 5;
                    if (nauczyciel && wychowawca) {
                        if (listView_Uczniowie.SelectedItems.Count == 1) pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[4];
                    }
                    else if (nauczyciel) {
                        if (listView_Uczniowie.SelectedItems.Count == 1) pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[1];
                    }
                    else if (wychowawca) {
                        if (listView_Uczniowie.SelectedItems.Count == 1) pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[2];
                    }
                    else {
                        if (listView_Uczniowie.SelectedItems.Count == 1) pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[0];
                    }
                    

                }
                else {
                    pictureBox_DuzaIkonaPrzedmiotu.Image = null;
                    label_Przedmiot.Text = "";
                    WyczyscTabeleOcenUcznia();
                }
                
            }


            else if (idZmiany == 3) {//lista uczniów
                if (listView_Uczniowie.SelectedItems.Count == 1 && listView_Przedmioty.SelectedItems.Count == 1) {
                    bool nauczyciel = listView_Przedmioty.SelectedItems[0].ImageIndex==4;
                    bool wychowawca = listView_ListaKlas.SelectedItems[0].ImageIndex==5;
                    if (nauczyciel && wychowawca) {
                        pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[4];
                    }
                    else if (nauczyciel) {
                        pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[1];
                    }
                    else if (wychowawca) {
                        pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[2];
                    }
                    else {
                        pictureBox_DuzaIkonaUcznia.Image = imageList2.Images[0];
                    }
                    label_Uczen.Text = listView_Uczniowie.SelectedItems[0].SubItems[0].Text + " " + listView_Uczniowie.SelectedItems[0].SubItems[1].Text;
                    WypelnijTabeleOcenUcznia();
                }
                else {
                    pictureBox_DuzaIkonaUcznia.Image = null;
                    label_Uczen.Text = "";
                    WyczyscTabeleOcenUcznia();
                }
            }


            else {
                throw new Exception("Błąd interdejsu, zakładka Oceny");
            }

            UstawPrzyciskiOcen();
        }
        void WypiszOcenyKoncowe() {
            int idUcznia = Convert.ToInt32(listView_Uczniowie.SelectedItems[0].SubItems[2].Text);
            int idPrzedmiotu = Convert.ToInt32(listView_Przedmioty.SelectedItems[0].Name);
            string s =  @"select 
	                        o.rodzaj, o.data, o.ocena, o.proponowana
                        from
	                        dziennik.dbo.uczniowie u inner join
	                        dziennik.dbo.klasy k on u.idKlasy = k.id inner join
	                        dziennik.dbo.przedmioty p on p.idKlasy = k.id inner join 
	                        (		
		                        select 
			                        ok.userIdUcznia, 'ok' as rodzaj, ok.data, ok.ocena, ok.proponowana 
		                        from 
			                        dziennik.dbo.ocenyKoncowe ok 
		                        where 
			                        ok.idPrzedmiotu = @idPrzedmiotu
		                        union all
		                        select 
			                        pzk.userIdUcznia, 'pzk' as rodzaj, pzk.data, pzk.ocena, pzk.proponowana 
		                        from 
			                        dziennik.dbo.zachowanie pzk 
		                        where 
			                        pzk.idPrzedmiotu = @idPrzedmiotu
		                        union all
		                        select 
			                        zk.userIdUcznia, 'zk' as rodzaj, zk.data, zk.ocena, zk.proponowana 
		                        from 
			                        dziennik.dbo.zachowanieKoncowe zk
		                        where 
			                        zk.semestr = 
			                        (
				                        select 
					                        k1.semestr 
				                        from 
					                        klasy k1 inner join 
					                        uczniowie u1 on u1.idKlasy = k1.id 
				                        where 
					                        u1.userId = @userIdUcznia
			                        )
	                        ) as o
	                        on o.userIdUcznia = u.userId
                        where 
	                        u.userId = @userIdUcznia and 
	                        p.id = @idPrzedmiotu;";


            SqlCommand cmd = new SqlCommand(s, SQLInterface.conn);
            cmd.Parameters.Add(new SqlParameter("@userIdUcznia", idUcznia));
            cmd.Parameters.Add(new SqlParameter("@idPrzedmiotu", idPrzedmiotu));
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read()) {
                if (rdr.GetString(0) == "ok") {
                    Label docelowaEtykieta;
                    if (rdr.GetBoolean(3)) {
                        docelowaEtykieta = label_proponowanaOcenaKoncowa;
                    }
                    else {
                        docelowaEtykieta = label_OcenaKoncowa;
                    }
                    docelowaEtykieta.Text = OcenaIntToString(rdr.GetInt32(2)) + " - " + rdr.GetDateTime(1).ToShortDateString();
                }

                if (rdr.GetString(0) == "pzk") {
                    Label docelowaEtykieta;
                    if (rdr.GetBoolean(3)) {
                        docelowaEtykieta = label_proponowanePrzedmiotoweZachowanie;
                    }
                    else {
                        docelowaEtykieta = label_przedmiotoweZachowanie;
                    }
                    docelowaEtykieta.Text = ZachowanieIntToString(rdr.GetInt32(2)) + " - " + rdr.GetDateTime(1).ToShortDateString();
                }

                if (rdr.GetString(0) == "zk") {
                    Label docelowaEtykieta;
                    if (rdr.GetBoolean(3)) {
                        docelowaEtykieta = label_proponowanieZachowanie;
                    }
                    else {
                        docelowaEtykieta = label_zachowanie;
                    }
                    docelowaEtykieta.Text = ZachowanieIntToString(rdr.GetInt32(2)) + " - " + rdr.GetDateTime(1).ToShortDateString();
                }       
            }
            rdr.Close();
            
        }
        void UstawPrzyciskiOcen() {
            /* 0 - nie wybrano
             * 1 - szary / wybrano
             * 2 - żółty
             * 3 - pomarańczowy
             */
            int k = listView_ListaKlas.SelectedItems.Count == 0 ? 0 : listView_ListaKlas.SelectedItems[0].ImageIndex - 2;
            int p = listView_Przedmioty.SelectedItems.Count == 0 ? 0 : listView_Przedmioty.SelectedItems[0].ImageIndex - 2;
            int u = listView_Uczniowie.SelectedItems.Count == 0 ? 0 : 1;

            if (k == 0 || k == 1 || (k == 2 && p == 1) || (k == 2 && p == 0)) { // nie wybrano klasy, klasa jest szara lub klasa jest żółta a przedmiot szary
                button_WystawOcene.Enabled = false;
                button_WystawOceneWybranemuUczniowi.Enabled = false;
                button_WystawOceneCalejKlasie.Enabled = false;

                button_WystawOceneKoncowa.Enabled = false;
                button_WystawOceneKoncowaWybranemuUczniowi.Enabled = false;
                button_WystawOceneKoncowaCalejKlasie.Enabled = false;

                button_WystawZachowanie.Enabled = false;
                button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = false;
                button_WystawPrzedmiotoweZachowanieCalejKlasie.Enabled = false;

                button_WystawZachowanieKoncowe.Enabled = false;
                button_WystawZachowanieKoncoweWybranemuUczniowi.Enabled = false;
                button_WystawZachowanieKoncoweCalejKlasie.Enabled = false;
            }
            else if (k == 2 && p == 2) { // klasa żółta, przedmiot też
                button_WystawOcene.Enabled = true;
                button_WystawOceneWybranemuUczniowi.Enabled = false;
                button_WystawOceneCalejKlasie.Enabled = true;

                button_WystawOceneKoncowa.Enabled = true;
                button_WystawOceneKoncowaWybranemuUczniowi.Enabled = false;
                button_WystawOceneKoncowaCalejKlasie.Enabled = true;

                button_WystawZachowanie.Enabled = true;
                button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = false;
                button_WystawPrzedmiotoweZachowanieCalejKlasie.Enabled = true;

                button_WystawZachowanieKoncowe.Enabled = false;
                button_WystawZachowanieKoncoweWybranemuUczniowi.Enabled = false;
                button_WystawZachowanieKoncoweCalejKlasie.Enabled = false;

                if (u == 1) {
                    button_WystawOceneWybranemuUczniowi.Enabled = true;
                    button_WystawOceneKoncowaWybranemuUczniowi.Enabled = true;
                    button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = true;
                }
                else {
                    button_WystawOceneWybranemuUczniowi.Enabled = false;
                    button_WystawOceneKoncowaWybranemuUczniowi.Enabled = false;
                    button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = false;
                }
            }
            else if (k == 3 && (p == 0 || p == 1)) {
                button_WystawOcene.Enabled = false;
                button_WystawOceneWybranemuUczniowi.Enabled = false;
                button_WystawOceneCalejKlasie.Enabled = false;

                button_WystawOceneKoncowa.Enabled = false;
                button_WystawOceneKoncowaWybranemuUczniowi.Enabled = false;
                button_WystawOceneKoncowaCalejKlasie.Enabled = false;

                button_WystawZachowanie.Enabled = false;
                button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = false;
                button_WystawPrzedmiotoweZachowanieCalejKlasie.Enabled = false;

                button_WystawZachowanieKoncowe.Enabled = true;
                button_WystawZachowanieKoncoweCalejKlasie.Enabled = true;

                if (u == 1) {
                    button_WystawZachowanieKoncoweWybranemuUczniowi.Enabled = true;
                }
                else {
                    button_WystawZachowanieKoncoweWybranemuUczniowi.Enabled = false;
                }
            }
            else if (k == 3 && p == 2) {
                button_WystawOcene.Enabled = true;                
                button_WystawOceneCalejKlasie.Enabled = true;

                button_WystawOceneKoncowa.Enabled = true;                
                button_WystawOceneKoncowaCalejKlasie.Enabled = true;

                button_WystawZachowanie.Enabled = true;                
                button_WystawPrzedmiotoweZachowanieCalejKlasie.Enabled = true;

                button_WystawZachowanieKoncowe.Enabled = true;                
                button_WystawZachowanieKoncoweCalejKlasie.Enabled = true;

                if (u == 1) {
                    button_WystawOceneWybranemuUczniowi.Enabled = true;
                    button_WystawOceneKoncowaWybranemuUczniowi.Enabled = true;
                    button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = true;
                    button_WystawZachowanieKoncoweWybranemuUczniowi.Enabled = true;
                }
                else {
                    button_WystawOceneWybranemuUczniowi.Enabled = false;
                    button_WystawOceneKoncowaWybranemuUczniowi.Enabled = false;
                    button_WystawPrzedmiotoweZachowanieWybranemuUczniowi.Enabled = false;
                    button_WystawZachowanieKoncoweWybranemuUczniowi.Enabled = false;
                }
            }
            else {
                throw new Exception("Coś się popsuło w uprawnieniach");
            }
        }



        string ZachowanieIntToString(int ocena) {
            switch (ocena) {
                case 1:
                    return "Naganne";
                case 2:
                    return "Nieodpowiednie";
                case 3:
                    return "Poprawne";
                case 4:
                    return "Dobre";
                case 5:
                    return "Bardzo dobre";
                case 6:
                    return "Wzorowe";
                default:
                    throw new Exception("Niewłaściwa ocena z zachowania");
            }
        }
        string OcenaIntToString(int ocena) {
            switch (ocena) {
                case 1:
                    return "Niedostateczny [1]";
                case 2:
                    return "Mierny [2]";
                case 3:
                    return "Dostateczny [3]";
                case 4:
                    return "Dobry [4]";
                case 5:
                    return "Bardzo dobry [5]";
                case 6:
                    return "Celujący [6]";
                default:
                    throw new Exception("Niewłaściwa ocena");
            }
        }
    }


    public class RekordListyKlas {
        public Image ikona;
        public string nazwa;
        public int poziomUprawnien;
        public int idKlasy;
        public RekordListyKlas(string nazwa, int poziom, int id) {
            this.nazwa = nazwa;
            poziomUprawnien = poziom;
            idKlasy = id;
        }
    }
}
